home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 41
/
Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso
/
-seriously_amiga-
/
cd-rom
/
acdb
/
src
/
addb_hosts.e
< prev
next >
Wrap
Text File
|
1999-04-28
|
7KB
|
294 lines
OPT OSVERSION=37,LARGE
OPT PREPROCESS,REG=5
/*
*-- AutoRev header do NOT edit!!
*
* Project : AMIGA CD [DATA] BASE - program obsîugujâcy CDDB
* File : acdb_hosts.e
* Description : wyôwietla listë serwerów CDDB
* Copyright : ©1999, Piotr Gapiïski
* Author : Piotr Gapiïski
* Creation Date : 25.03.99
* Current version : 1.1
* Translator : AmigaE v3.3a
*
*-- REVISION HISTORY
*
* 1.1 (25.03.99)
* o parametry podczas wywoîywania programu
* o moûliwoôê przerwania dziaîania programu przez naciôniëcie CTRL-C
*
* 1.0 (10.01.99)
* o pierwsza wersja
* o zmieniony parser z AFC/PARSER na wîasnâ produkcjë
* o program mógî zawiesiê komputer gdyby nie wykryî bsdsocket.library
*
*-- REV_END --*
*/
MODULE 'bsdsocket','tools/file','dos/dos','dos/rdargs'
MODULE '*acdb_net'
#define DEF_HOST 'www.cddb.com'
#define PORT 80
CONST MAXBUF = 10240
ENUM ARG_HOST, NUMARGS
PROC main() HANDLE
DEF sd=-1, buf=NIL:PTR TO CHAR, bytes, rc=RETURN_FAIL, code
DEF rdargs=NIL, args:PTR TO LONG, host
VOID '$VER: acdb_hosts 1.1 (25.03.99) ©1999, Piotr Gapinski'
NEW args[NUMARGS]
rdargs := ReadArgs('HOST', args, NIL)
IF (rdargs)
->-
->- parametry przekazana przez CLI
->-
host := args[ARG_HOST]
ENDIF
IF (host = NIL) THEN host := DEF_HOST
IF (socketbase := OpenLibrary('bsdsocket.library', 4))=NIL
->-
->- brak biblioteki
->-
WriteF('cannot open bsdsocket.library v4+!\n')
Raise()
ENDIF
buf := New(MAXBUF)
WriteF('connecting to \s:\d\n', host, PORT)
IF (sd := netConnect(host, PORT)) >= 0
->-
->- poîâczenie nawiâzane, wyôlij zapytanie
->- zapytanie zawiera informacje dotyczâce miëdzy innymi autora programu, nazwy
->- programu, jego wersji oraz suportowanym poziomie komend (proto)
->-
WriteF('OK, now sending query string\n')
IF netSendcmd(sd, '/~cddb/cddb.cgi?cmd=sites&hello=narg+polbox.com+acdb+1.0&proto=4')<>FALSE
->-
->- ciâgle jest OK.
->-
WriteF('OK, reading\n')
IF (bytes := receive(sd, buf, MAXBUF))>0
code := Val(buf)
IF (code = 210)
->-
->- udaîo sië coô odebraê, wyôwietlaj!
->-
WriteF('Done!\n\n')
IF showsites(buf, bytes)=FALSE THEN WriteF('Unknown error!\n') ELSE rc := RETURN_OK
ELSE
->-
->- bîâd zwrócony przez CDDB
->-
WriteF('cddb error (code: \d)!\n',code)
ENDIF
ELSE
WriteF('cannot read data from host!\n')
ENDIF
ELSE
WriteF('connection broken!\n')
ENDIF
CloseSocket(sd)
ELSE
WriteF('cannot resolve CDDB host address!\n')
ENDIF
EXCEPT DO
IF (rdargs) THEN FreeArgs(rdargs)
END args
IF (buf) THEN Dispose(buf)
IF (socketbase) THEN CloseLibrary(socketbase)
ENDPROC rc
OBJECT parse
command :PTR TO CHAR
template :PTR TO CHAR
func :LONG
ENDOBJECT
PROC showsites(buf:PTR TO CHAR, size) HANDLE
->-
->- procedura dekodujâca dane zawarte w buforze
->- format danych poniûej
->- zwraca TRUE/FALSE
->-
->- us.cddb.com cddbp 888 - N039.46 W086.09 Random US site
->- us.cddb.com http 80 /~cddb/cddb.cgi N039.46 W086.09 Random US site
->-
DEF rda=NIL:PTR TO rdargs
DEF list:PTR TO LONG, listlen, x, rc=TRUE, command
rda:=AllocDosObject(DOS_RDARGS,NIL)
IF (rda=NIL) THEN Raise()
rda.flags:=rda.flags OR RDAF_NOPROMPT
->-
->- podziaî bufora na linie
->- pierwsza linia zawiera kod zwrotny, ostatnia zawiera kropkë - moûna je pominâê
->-
list := stringsinfile(buf, size, countstrings(buf, size))
listlen := ListLen(list)
IF (listlen < 3) THEN Raise()
->-
->- dla kaûdej linii dekoduj
->-
command := [NIL,'ADDR,PROTOCOL,PORT/N,CGI,LOCATION/F',{func}]:parse
FOR x := 1 TO (listlen - 2) DO rc := rc AND parseCommand(rda, command, ListItem(list, x))
FreeDosObject(DOS_RDARGS,rda)
RETURN rc
EXCEPT
ENDPROC FALSE
ENUM ARG_ADDR, ARG_PROTOCOL, ARG_PORT, ARG_CGI, ARG_LOCATION
PROC func(args:PTR TO LONG)
->-
->- funkcja pobierajâca dane po przetworzeniu przed ReadArgs()
->- i wyôwietlajâca je w CLI
->- do funkcji przekazywana jest tablica ûâdanych wartoôci
->- zwraca TRUE/FALSE
->-
DEF addr, protocol, port, cgi, location, tmp
addr := args[ARG_ADDR]
protocol := args[ARG_PROTOCOL]
port := IF (tmp := args[ARG_PORT]) THEN ^tmp ELSE 80
cgi := args[ARG_CGI]
location := args[ARG_LOCATION]
IF (addr) AND (protocol) AND (location)
->-
->- wyôwietlaj tylko serwery suportujâce HTTP
->-
LowerStr(protocol)
IF StrCmp('http',protocol) THEN WriteF('\s:\d, \s\n', addr, port, location)
ENDIF
ENDPROC TRUE
PROC parseCommand(rda:PTR TO rdargs,parser:PTR TO parse,str:PTR TO CHAR) HANDLE
->-
->- procedura zajmujâca sië obróbkâ (rozbiciem) parametrów w linii znaków
->-
DEF rd,i=0,char,func,len
DEF args:PTR TO LONG,nargs=0,rc=FALSE
DEF buffer
->-
->- gdy nie potrzeba argumentów
->- wywoîaj funkcjë bezpoôrednio
->-
func:=parser.func
IF (parser.template=NIL) THEN RETURN func()
->-
->- w przeciwnym razie policz ile funkcja potrzebuje argumentów
->-
WHILE (char:=parser.template[i++]) DO IF char="," THEN nargs++
nargs++
NEW args[nargs]
->-
->- przygotuj bufor
->- dane nie mogâ sië koïczyê znakiem /0 tylko /n!
->-
len := StrLen(str)
buffer := String(len + 10)
StrCopy(buffer, str)
buffer[len] := "\n"
buffer[len+1] :="\0"
rda.source.buffer := buffer
rda.source.length := len + 1
rda.source.curchr := 0
rda.dalist := NIL
rda.buffer := NIL
rd:=ReadArgs(parser.template, args, rda)
IF (rd)
->-
->- wywoîaj odpowiedniâ funkcjë
->-
rc:=func(args)
FreeArgs(rd)
ENDIF
EXCEPT DO
DisposeLink(buffer)
END args[nargs]
ENDPROC rc
PROC receive(sd, buff:PTR TO CHAR, max)
->-
->- odbiera max bajtów do bufora w paczkach po 100 bajtów
->- odbiór moûna przerwaê wysyîajâc do tasku programu sygnaî CTRL-D
->- zwraca TRUE/FALSE (TRUE gdy wszystkie dane zostaîy odebrane)
->-
DEF len=0, i=0
SetSignal(0, SIGBREAKF_CTRL_C)
WHILE TRUE
EXIT (len > max)
i := Recv(sd, (buff + len), 100, 0)
EXIT (i<=0)
len := len + i
IF (SetSignal(0, SIGBREAKF_CTRL_C) AND SIGBREAKF_CTRL_C) THEN RETURN 0
ENDWHILE
->-
->- i=0 oznacza koniec odbioru
->-
IF (len > max) OR (i < 0) THEN RETURN FALSE
ENDPROC len